var fsPerPixelLightsContent =
        
    '#ifdef GL_ES \nprecision highp float; \n#endif' + '\n'
    
    + '\n'
    
    // Ambient light color
    + 'uniform vec3 uAmbientColor; \n'
    
    // Directional light color
    + 'uniform vec3 uDirectionalLightColor; \n'
    
    // Material
    + 'uniform vec3 uKe; \n'
    + 'uniform vec3 uKa; \n'
    + 'uniform vec3 uKd; \n'
    + 'uniform vec3 uKs; \n'
    + 'uniform float uAlpha; \n'
    
    // 
    + 'varying vec4 vPosition; \n'
    + 'varying vec3 vNormal; \n'
    + 'varying vec3 vLightDir; \n'
    
    + '\n'
    
    + 'void main( void ) {'
        + '\n'

        + '\t vec3 normalizedNormal = normalize( vNormal );\n'

        // Compute ambiant term
        + '\t vec3 ambient = uKa * uAmbientColor ; \n'

        // Compute diffuse term
        + '\t float diffuseCoeff = max( dot( vLightDir, normalizedNormal ), 0.0 ); \n'
        + '\t vec3 diffuse = uKd * uDirectionalLightColor * diffuseCoeff; \n'

        // Compute specular term
        + '\t vec3 eyeDir = normalize( -vPosition.xyz ); \n'

        // Blinn Phong
        + '\t vec3 halfDir = normalize( vLightDir + eyeDir ); \n'
        + '\t float specAngle = max( dot( halfDir, normalizedNormal ), 0.0 ); \n'

        // Phong
//        + '\t vec3 reflectionDir = reflect( -vLightDir, normalizedNormal ); \n'
//        + '\t float specAngle = max( dot( reflectionDir, eyeDir ), 0.0 ); \n'

        + '\t float specularCoeff = pow( specAngle, 64.0 ); \n'
        + '\t vec3 specular = uKs * specularCoeff; \n'

        + '\t gl_FragColor = vec4( ambient + diffuse + specular, uAlpha ); \n'

        + '\n'
    + '}';

